/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.pangalacteos.dao;

import br.com.pangalacteos.modelo.Fatura;
import br.com.pangalacteos.modelo.FaturaStatus;
import br.com.pangalacteos.modelo.Fornecedor;
import br.com.pangalacteos.util.HibernateUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author Leandro Del Sole
 */
public class FaturaDAO extends HibernateDAO<Fatura>{

    public List<Fatura> findFaturaToPay(Date dtvencimento){
        Session sess = HibernateUtil.getSession();
        try{
            Criteria criteria = sess.createCriteria(Fatura.class);
            criteria.add(Restrictions.le("dtvencimento", dtvencimento));
            criteria.add(Restrictions.eq("cdstatus", FaturaStatus.NAO_PAGA.toString()));
            List<Fatura> encontrados = criteria.list();
            
            if (encontrados == null) return Collections.emptyList();
            
            return encontrados;
        } finally {
            if (sess.isOpen()) sess.close();
        }
    }
    public List<Fatura> generateRelatorioFatura(
            Fornecedor fornecedor, 
            Date lancamentoDe, Date lancamentoAte,
            Date vencimentoDe, Date vencimentoAte,
            Date pagamentoDe, Date pagamentoAte,
            boolean aberta,
            boolean paga,
            boolean estornada){
        
        Session sess = HibernateUtil.getSession();
        try {
            Criteria criteria = sess.createCriteria(Fatura.class);
            if (fornecedor != null){
                criteria.add(Restrictions.eq("cdfornecedor", fornecedor));
            }
            if (lancamentoDe != null){
                criteria.add(Restrictions.ge("dtfatura", lancamentoDe));
            }
            if (lancamentoAte != null){
                criteria.add(Restrictions.le("dtfatura", lancamentoAte));
            }
            if (vencimentoDe != null){
                criteria.add(Restrictions.ge("dtvencimento", vencimentoDe));
            }
            if (vencimentoAte != null){
                criteria.add(Restrictions.le("dtvencimento", vencimentoAte));
            }
            if (pagamentoDe != null){
                criteria.add(Restrictions.ge("dtpagamento", pagamentoDe));
            }
            if (pagamentoAte != null){
                criteria.add(Restrictions.le("dtpagamento", pagamentoAte));
            }
            
            List<Object> status = new ArrayList<Object>();
            if (aberta) status.add("N");
            if (paga) status.add("P");
            if (estornada) status.add("E");
            
            if (status != null && status.size() > 0){
                criteria.add(Restrictions.in("cdstatus", status));
            }
            
            List<Fatura> encontrados = criteria.list();
            
            if (encontrados == null) return Collections.emptyList();
            
            return encontrados;
        } finally {
            if (sess.isOpen()) sess.close();
        }
        
    }
}
